#!bin/bash
TAP="tap0"
TIMEOUT=1
ROOT=`pwd`
IPv="inet"
DNS=" "

### ARCHIVOS DNS
PATH_RED=""
OVPN_DNS=""
SCPT_DNS=""
PATH_DNS=""

## REDES TOPOLOGIA
PATH_RED_DNS1="openvpn/dns1"
PATH_RED_DNS2="openvpn/dns2"
PATH_RED_DNSroot="openvpn/dnsroot"

OPENVPN_DNS1="dns1.conf"
OPENVPN_DNS2="dns2.conf"
OPENVPN_DNSroot="dnsroot.conf"

## SCRIPTS
PATH_SCRIPT="scripts"

SCRIPT_DNS1="dns1.sh"
SCRIPT_DNS2="dns2.sh"
SCRIPT_DNSroot="dnsRoot.sh"

## SCRIPT INSTALADORES DNS
LEV_DNS="instalarServidorDNS.sh"
DET_DNS="desinstalarServidorDNS.sh"

PATH_DNS1="servers/dns-alternativo/DNS1"
PATH_DNS2="servers/dns-alternativo/DNS2"
PATH_DNSroot="servers/dns-alternativo/DNSroot"

### INICIO SCRIPT

echo""

if [[ "$#" -ne 2 ]]; then
	echo "Se invoca el comando mediante 2 operandos: [#dns] [acción]"
	echo ""
	echo "DNS disponibles: 1, 2, root"
	echo ""
	echo "Acciones disponibles:"
	echo " up: levanta el servidor DNS"
	echo " down: detiene el servidor DNS"
	echo " stopVPN: detiene una VPN"
	echo ""
	echo "Ej: $0 root up"
fi

#Compruebo se ejecute el script mediante el usuario root.
if [[ ( "$#" -eq 2) && ($(whoami) != "root") ]] ; then
	echo "[ERROR] Usuario no root, emplee superusuario (sudo)."
fi

if [[ "$#" == "2" ]]; then
	if [[ ("$1" == "1")  || ("$1" == "2") || ("$1" == "root") ]]; then
		DNS=$1
	
		AUX="PATH_RED_DNS$DNS"
		PATH_RED=${!AUX}

		AUX="OPENVPN_DNS$DNS"
		OVPN_DNS=${!AUX}

		AUX="SCRIPT_DNS$DNS"
		SCPT_DNS=${!AUX}
	
		AUX="PATH_DNS$DNS"
		PATH_DNS=${!AUX}

		DNS="OK"

		if [[ !( ("$2" == "up" ) || ("$2" == "down") || ("$2" == "stopVPN" ) ) ]]; then
			echo "[ERROR] Segundo parámetro inválido, acción desconocida"
		fi
	else
		echo "[ERROR] Primer parámetro inválido"
	fi

fi

if [[ ("$DNS" == "OK") && ("$2" == "up") && ($(whoami) == "root") ]] ; then

	if [[ `openvpn --version | grep -c "^OpenVPN [0-9.]* "` -eq 1 ]]; then

		echo " * OpenVPN se encuentra instalado"
	else

		echo "[ERROR] OpenVPN no se encuentra instalado"
		apt-get install openvpn
	fi 
	
	# levanto la interfaz $TAP
	if [[ `ifconfig | grep -c "$TAP" ` -eq 0 ]] ; then
		exec openvpn --mktun --dev "$TAP" &>/dev/null &

		if [[ `ifconfig | grep -c "$TAP" ` -eq 0 ]] ; then
			echo " * Se levantó la interfaz $TAP"
		fi
	else
		echo " * Se encontró una interfaz $TAP levantada"
	fi

	if [[ ` ifconfig | grep "$TAP" -A6 | grep -c "PROMISC" ` -eq 1 ]] ; then
		echo " * Modo promiscuo en la interfaz $TAP activo"
	else
		# habilito la interfaz en modo promiscuo
		`ifconfig $TAP 0.0.0.0 promisc up`
		echo " * Se activó el modo promiscuo en la interfaz $TAP"
	fi

	if [[ ` ps ax | grep openvpn | grep -c "$OVPN_DNS" ` -eq 0 ]] ; then

		# establezco la conexión con el servidor
		cd "$ROOT/$PATH_RED"
		exec openvpn $OVPN_DNS &>/dev/null &

		# espero que se establezca la conexión VPN
		echo " * Esperando se establezca la conexión VPN... "
		IP_ASIGNADA=0
		while [[ $IP_ASIGNADA -ne 2 ]] ; do
			IP_ASIGNADA=` ifconfig "$TAP" | grep -c "$IPv" `
			sleep $TIMEOUT
		done
	
		echo " * Conexión VPN establecida"

		# modifico la tabla de ruteo
		echo " * Modificando la tabla de ruteo"
		cd "$ROOT/$PATH_SCRIPT"
		pwd
		dor
		bash "$SCPT_DNS"

		# levanto el servidor DNS1
		cd "$ROOT/$PATH_DNS"
		bash $LEV_DNS

	else

		echo "[ERROR] Existe actualmente una conexión VPN establecida"
	fi
fi

if [[ ("$DNS" == "OK" ) && ("$2" == "down") && ($(whoami) == "root") ]] ; then

	cd "$ROOT/$PATH_DNS"
	bash "$DET_DNS"
fi

if [[ ("$DNS" == "OK" ) && ( "$2" == "down" || "$2" == "stopVPN") && ($(whoami) == "root") ]] ; then

	PID=`ps ax | grep openvpn | grep "$OVPN_DNS" | sed "s/^[^0-9]*\([0-9]*\).*$/\1/"`
	if [[ $PID -ne 0 ]]; then
		kill -9 "$PID"
		echo " * Se detuvo la conexión VPN"
	else
		if [[ "$2" == "stopVPN" ]] ; then
			echo " * No se encontró una conexión VPN."
		fi
	fi

	CANT=`ifconfig | grep -c $TAP ` 
	if [[ $CANT -gt 1 ]]; then
		echo "[ERROR] No se puede eliminar la interfaz"
	fi

	# elimino el túnel
	if [[ $CANT -eq 1 ]]; then
		exec openvpn --rmtun --dev $TAP &>/dev/null &
		echo " * Se eliminó la interfaz "$TAP" "
		echo " * Se eliminaron las entradas en la tabla de ruteo"
	fi
fi

cd "$ROOT"
echo ""
